package jugadorVirtual;

import arti.tsb.LinkedList;
import entidades.Jugador;
import entidades.Mision;
import entidades.Pais;
import entidades.Tarjeta;
import entidades.Tropa;
import gestion.comunicacion.ClienteVirtual;
import herramientas.HashTable;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JToggleButton;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public class Principal {

    private JCheckBox jCB_tarjeta0;
    private JCheckBox jCB_tarjeta1;
    private JCheckBox jCB_tarjeta2;
    private JCheckBox jCB_tarjeta3;
    private JCheckBox jCB_tarjeta4;
    private javax.swing.JToggleButton jTB_0;
    private javax.swing.JToggleButton jTB_1;
    private javax.swing.JToggleButton jTB_10;
    private javax.swing.JToggleButton jTB_11;
    private javax.swing.JToggleButton jTB_12;
    private javax.swing.JToggleButton jTB_13;
    private javax.swing.JToggleButton jTB_14;
    private javax.swing.JToggleButton jTB_15;
    private javax.swing.JToggleButton jTB_16;
    private javax.swing.JToggleButton jTB_17;
    private javax.swing.JToggleButton jTB_18;
    private javax.swing.JToggleButton jTB_19;
    private javax.swing.JToggleButton jTB_2;
    private javax.swing.JToggleButton jTB_20;
    private javax.swing.JToggleButton jTB_21;
    private javax.swing.JToggleButton jTB_22;
    private javax.swing.JToggleButton jTB_23;
    private javax.swing.JToggleButton jTB_24;
    private javax.swing.JToggleButton jTB_25;
    private javax.swing.JToggleButton jTB_26;
    private javax.swing.JToggleButton jTB_27;
    private javax.swing.JToggleButton jTB_28;
    private javax.swing.JToggleButton jTB_29;
    private javax.swing.JToggleButton jTB_3;
    private javax.swing.JToggleButton jTB_30;
    private javax.swing.JToggleButton jTB_31;
    private javax.swing.JToggleButton jTB_32;
    private javax.swing.JToggleButton jTB_33;
    private javax.swing.JToggleButton jTB_34;
    private javax.swing.JToggleButton jTB_35;
    private javax.swing.JToggleButton jTB_36;
    private javax.swing.JToggleButton jTB_37;
    private javax.swing.JToggleButton jTB_38;
    private javax.swing.JToggleButton jTB_39;
    private javax.swing.JToggleButton jTB_4;
    private javax.swing.JToggleButton jTB_40;
    private javax.swing.JToggleButton jTB_41;
    private javax.swing.JToggleButton jTB_42;
    private javax.swing.JToggleButton jTB_43;
    private javax.swing.JToggleButton jTB_44;
    private javax.swing.JToggleButton jTB_45;
    private javax.swing.JToggleButton jTB_46;
    private javax.swing.JToggleButton jTB_47;
    private javax.swing.JToggleButton jTB_48;
    private javax.swing.JToggleButton jTB_49;
    private javax.swing.JToggleButton jTB_5;
    private javax.swing.JToggleButton jTB_6;
    private javax.swing.JToggleButton jTB_7;
    private javax.swing.JToggleButton jTB_8;
    private javax.swing.JToggleButton jTB_9;
    //
    private ClienteVirtual cli;
    private JCheckBox[] cb_tarjetas = new JCheckBox[5];
    private HashTable paises = new HashTable(50);
    private LinkedList tarjetas = new LinkedList();
    private ArrayList<Jugador> jugadores;
    private int jugadorComienzaRonda;
    private int jugadorTurnoActual;
    private Mision[] misiones = {new Mision(0), new Mision(1), new Mision(2), new Mision(3), new Mision(4), new Mision(5), new Mision(6), new Mision(7), new Mision(8), new Mision(9), new Mision(10), new Mision(11), new Mision(12), new Mision(13)};
    private int ronda = 1;
    private int cantidadTropasAgregar = 0;
    private boolean finPartida = false;
    private int[] cantidadTropasAgregarPorContinentes = new int[6];
    private boolean puedeAgregar = true;
    private int paisesConquistadosEnTurno = 0;
    private long duerme = 800;
    private long duermeMas = 2000;
    private String delimitador = "&-&-&";
    private boolean sacarTarjeta = false;
    private int nroCanje = 0;
    private boolean cambioRonda = false;
    private ArrayList<Tarjeta> tarjetasFueraDelMazo = new ArrayList();
    private int tipoMision;

    public Principal(ClienteVirtual cli, ArrayList<Jugador> jugadores, int[] paises, int jugadorComienzaRonda, int misionPropia, int[] tarjetas,int tipoMis) {
        initComponents();
        this.tipoMision = tipoMis;
        cb_tarjetas[0] = this.jCB_tarjeta0;
        cb_tarjetas[1] = this.jCB_tarjeta1;
        cb_tarjetas[2] = this.jCB_tarjeta2;
        cb_tarjetas[3] = this.jCB_tarjeta3;
        cb_tarjetas[4] = this.jCB_tarjeta4;

        for (int i = 0; i < 50; i++) {
            this.tarjetas.addFirst(new Tarjeta(tarjetas[i]));
        }

        //Hilo Cliente
        this.cli = cli;
        this.cli.setPrincipal(this);

        this.jugadores = jugadores;
        this.jugadorComienzaRonda = jugadorTurnoActual = jugadorComienzaRonda;

        for (int i = 0; i < jugadores.size(); i++) {
            if (jugadores.get(i).getId() == this.cli.getIdJugador()) {
                Mision mision = misiones[misionPropia];
                jugadores.get(i).setMision(mision);
                mision.verficarExistenciaColor(jugadores, this.cli.getIdJugador());
                break;
            }
        }

        crearYAsignarPaises(paises);

        if (jugadorComienzaRonda == this.cli.getIdJugador()) {
            habilitarAgregarTropas();
        }
    }

    private void initComponents() {
        jCB_tarjeta0 = new javax.swing.JCheckBox();
        jCB_tarjeta1 = new javax.swing.JCheckBox();
        jCB_tarjeta2 = new javax.swing.JCheckBox();
        jCB_tarjeta3 = new javax.swing.JCheckBox();
        jCB_tarjeta4 = new javax.swing.JCheckBox();
        jTB_0 = new javax.swing.JToggleButton();
        jTB_1 = new javax.swing.JToggleButton();
        jTB_2 = new javax.swing.JToggleButton();
        jTB_3 = new javax.swing.JToggleButton();
        jTB_4 = new javax.swing.JToggleButton();
        jTB_5 = new javax.swing.JToggleButton();
        jTB_6 = new javax.swing.JToggleButton();
        jTB_7 = new javax.swing.JToggleButton();
        jTB_8 = new javax.swing.JToggleButton();
        jTB_9 = new javax.swing.JToggleButton();
        jTB_10 = new javax.swing.JToggleButton();
        jTB_11 = new javax.swing.JToggleButton();
        jTB_12 = new javax.swing.JToggleButton();
        jTB_13 = new javax.swing.JToggleButton();
        jTB_14 = new javax.swing.JToggleButton();
        jTB_15 = new javax.swing.JToggleButton();
        jTB_16 = new javax.swing.JToggleButton();
        jTB_17 = new javax.swing.JToggleButton();
        jTB_18 = new javax.swing.JToggleButton();
        jTB_19 = new javax.swing.JToggleButton();
        jTB_20 = new javax.swing.JToggleButton();
        jTB_21 = new javax.swing.JToggleButton();
        jTB_22 = new javax.swing.JToggleButton();
        jTB_23 = new javax.swing.JToggleButton();
        jTB_24 = new javax.swing.JToggleButton();
        jTB_25 = new javax.swing.JToggleButton();
        jTB_26 = new javax.swing.JToggleButton();
        jTB_27 = new javax.swing.JToggleButton();
        jTB_28 = new javax.swing.JToggleButton();
        jTB_29 = new javax.swing.JToggleButton();
        jTB_30 = new javax.swing.JToggleButton();
        jTB_31 = new javax.swing.JToggleButton();
        jTB_32 = new javax.swing.JToggleButton();
        jTB_33 = new javax.swing.JToggleButton();
        jTB_34 = new javax.swing.JToggleButton();
        jTB_35 = new javax.swing.JToggleButton();
        jTB_36 = new javax.swing.JToggleButton();
        jTB_37 = new javax.swing.JToggleButton();
        jTB_38 = new javax.swing.JToggleButton();
        jTB_39 = new javax.swing.JToggleButton();
        jTB_40 = new javax.swing.JToggleButton();
        jTB_41 = new javax.swing.JToggleButton();
        jTB_42 = new javax.swing.JToggleButton();
        jTB_43 = new javax.swing.JToggleButton();
        jTB_44 = new javax.swing.JToggleButton();
        jTB_45 = new javax.swing.JToggleButton();
        jTB_46 = new javax.swing.JToggleButton();
        jTB_47 = new javax.swing.JToggleButton();
        jTB_48 = new javax.swing.JToggleButton();
        jTB_49 = new javax.swing.JToggleButton();
    }

    private void crearYAsignarPaises(int[] paises) {
        JToggleButton[] botones = {
            jTB_0, jTB_1, jTB_2, jTB_3, jTB_4, jTB_5, jTB_6, jTB_7, jTB_8, jTB_9, jTB_10, jTB_11, jTB_12, jTB_13, jTB_14, jTB_15, jTB_16, jTB_17, jTB_18, jTB_19, jTB_20, jTB_21, jTB_22, jTB_23, jTB_24, jTB_25, jTB_26, jTB_27, jTB_28, jTB_29, jTB_30, jTB_31, jTB_32, jTB_33, jTB_34, jTB_35, jTB_36, jTB_37, jTB_38, jTB_39, jTB_40, jTB_41, jTB_42, jTB_43, jTB_44, jTB_45, jTB_46, jTB_47, jTB_48, jTB_49
        };
        //Metodo Con XML
        try {
            DocumentBuilderFactory fabrica1 = DocumentBuilderFactory.newInstance();
            fabrica1.setValidating(true);
            fabrica1.setIgnoringElementContentWhitespace(true);

            DocumentBuilder constructor1 = fabrica1.newDocumentBuilder();
            File datosPais = new File("./datos/datosPaises.xml");
            //File datosPais = new File(getClass().getResource("/datos/datosPaises.xml").toURI().getPath());
            if (datosPais.exists()) {
                System.out.println("El archivo existe, creando paises");
            }
            Document paisesDocumento = constructor1.parse(datosPais);
            Element paisElemento = paisesDocumento.getDocumentElement();
            NodeList NodoPais = paisElemento.getChildNodes();

            Pais p;
            for (int i = 0; i < NodoPais.getLength(); i++) {

                Element pais = (Element) NodoPais.item(i);
                NodeList idLista = pais.getElementsByTagName("id");
                Text id = (Text) idLista.item(0).getFirstChild();

                NodeList listaNombre = pais.getElementsByTagName("nombre");
                Text nombre = (Text) listaNombre.item(0).getFirstChild();

                p = new Pais(Integer.parseInt(id.getData()), nombre.getData(), botones[i]);
                p.actualizarConquistador(jugadores.get(paises[i]));

                NodeList listaIdCont = pais.getElementsByTagName("idcontinente");
                Text idCont = (Text) listaIdCont.item(0).getFirstChild();
                p.setIdContinente(Integer.parseInt(idCont.getData()));

                NodeList listaRuta = pais.getElementsByTagName("rutaImagen");
                Text ruta = (Text) listaRuta.item(0).getFirstChild();
                ImageIcon ic = new ImageIcon(getClass().getResource(ruta.getData()));
                p.addImagen(ic);

                this.paises.put(p);
                jugadores.get(paises[i]).addPais(p);
                if (jugadores.get(paises[i]).getId() == cli.getIdJugador()) {
                    jugadores.get(paises[i]).actualizarContadorPais(p);
                }
            }

            agregarLimitesEImagen();
        } catch (IOException ex) {
            System.out.println("Error el archivo no existe...");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    private void agregarLimitesEImagen() {
        try {
            DocumentBuilderFactory fabrica1 = DocumentBuilderFactory.newInstance();
            fabrica1.setValidating(true);
            fabrica1.setIgnoringElementContentWhitespace(true);

            DocumentBuilder constructor1 = fabrica1.newDocumentBuilder();
            File datosPais = new File("./datos/datosPaises.xml");
            //File datosPais = new File(getClass().getResource("/datos/datosPaises.xml").toURI().getPath());
            if (datosPais.exists()) {
                System.out.println("El archivo existe, cargando límites");
            }
            Document paisesDocumento = constructor1.parse(datosPais);
            Element paisElemento = paisesDocumento.getDocumentElement();
            NodeList NodoPais = paisElemento.getChildNodes();
            for (int i = 0; i < NodoPais.getLength(); i++) {
                Pais aux = (Pais) this.paises.getObject(i);
                Element pais = (Element) NodoPais.item(i);
                NodeList limiteLista = pais.getElementsByTagName("limite");
                for (int j = 0; j < limiteLista.getLength(); j++) {

                    int idA = Integer.parseInt(limiteLista.item(j).getFirstChild().getNodeValue());
                    aux.addLimite((Pais) this.paises.getObject(idA));
                }


            }

        } catch (IOException ex) {
            System.out.println("Error el archivo no existe...");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void habilitarAgregarTropas() {
        try {
            Thread.sleep(duermeMas);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }

        if (this.ronda == 1) {
            this.cantidadTropasAgregar = 5;
            if(this.tipoMision==0){
                verificarMisionOcupacion();
            }
            
        } else if (this.ronda == 2) {
            this.cantidadTropasAgregar = 3;
        } else {
            calcularTropasPorContinentes();
            this.cantidadTropasAgregar = calcularTropasAgregar();
        }
        
        //Canjear
        
        agregarVirtual();
    }

    private void verificarMisionOcupacion() {
        if (jugadores.get(cli.getIdJugador()).getMision().isCumplida()) {
            finDePartida("");
            cli.avisarFinPartida();
        }
    }

    private void finDePartida(String string) {
        finPartida = true;
        for (int j = 0; j < this.paises.size(); j++) {
            ((Pais) this.paises.getObject(j)).getJB().setEnabled(true);
        }
    }

    private void calcularTropasPorContinentes() {
        int[] paisesContinentes = {6, 10, 6, 9, 15, 4};
        int[] paisesJugador = this.jugadores.get(this.jugadorTurnoActual).getContinentes();

        for (int i = 0; i < paisesContinentes.length; i++) {
            this.cantidadTropasAgregarPorContinentes[i] = 0;
            if (paisesContinentes[i] == paisesJugador[i]) {
                switch (i) {
                    case 0:
                        this.cantidadTropasAgregarPorContinentes[i] = 3;
                        break;
                    case 1:
                        this.cantidadTropasAgregarPorContinentes[i] = 5;
                        break;
                    case 2:
                        this.cantidadTropasAgregarPorContinentes[i] = 3;
                        break;
                    case 3:
                        this.cantidadTropasAgregarPorContinentes[i] = 5;
                        break;
                    case 4:
                        this.cantidadTropasAgregarPorContinentes[i] = 7;
                        break;
                    case 5:
                        this.cantidadTropasAgregarPorContinentes[i] = 2;
                        break;
                }
            }
        }
    }

    private int calcularTropasAgregar() {
        int contador = cantidadPaisesPropios();
        if (contador < 6) {
            contador = 6;
        }
        return contador / 2;
    }

    private int cantidadPaisesPropios() {
        return jugadores.get(this.jugadorTurnoActual).getCantidadPaises();
    }

    private void jB_agregarActionPerformed(Pais pAux) {

        Pais p = pAux;
        int idB = p.getId();
        if (this.cantidadTropasAgregarPorContinentes[p.getIdContinente()] != 0) {
            this.cantidadTropasAgregarPorContinentes[p.getIdContinente()]--;

            agregarTropaPais(pAux);
            this.cli.avisarAgregacionDeTropa(idB);
        } else {
            if (cantidadTropasAgregar != 0) {
                this.cantidadTropasAgregar--;

                agregarTropaPais(pAux);
                this.cli.avisarAgregacionDeTropa(idB);
            }
        }

        if (this.cantidadTropasAgregar == 0 && this.cantidadTropasAgregarPorContinentes[0] == 0 && this.cantidadTropasAgregarPorContinentes[1] == 0 && this.cantidadTropasAgregarPorContinentes[2] == 0 && this.cantidadTropasAgregarPorContinentes[3] == 0 && this.cantidadTropasAgregarPorContinentes[4] == 0 && this.cantidadTropasAgregarPorContinentes[5] == 0) {
            puedeAgregar = false;
        }
    }

    public void agregarTropaPais(Pais pAux) {
        Pais p = pAux;
        p.addTropa(new Tropa(true));
        p.getJB().setEnabled(true);

        try {
            Thread.sleep(duerme);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void agregarTropaPais(int idPais) {
        Pais p = (Pais) this.paises.getObject(idPais);
        p.addTropa(new Tropa(true));
        p.getJB().setEnabled(true);
    }

    //Virtual
    private void agregarVirtual() {
        Jugador j = jugadores.get(this.jugadorTurnoActual);
        ArrayList<Pais> paisesAux = j.getPaises();
        int cantidadPaises = paisesAux.size();
        ArrayList<Pais> paisesEnemigos;

        while (this.puedeAgregar) {
            for (int i = 0; i < cantidadPaises; i++) {
                Pais pAux = paisesAux.get(i);
                paisesEnemigos = pAux.getPaisesEnemigos();
                for (int k = 0; k < paisesEnemigos.size(); k++) {
                    Pais pLim = paisesEnemigos.get(k);
                    if (pLim.getCantidadTropas() - pAux.getCantidadTropas() > 2) {
                        jB_agregarActionPerformed(pAux);
                    }
                }
            }

            Mision m = j.getMision();
            if (m.getId() < 6) {
                for (int i = 0; i < cantidadPaises; i++) {
                    Pais pAux = paisesAux.get(i);
                    paisesEnemigos = pAux.getPaisesEnemigos();
                    for (int k = 0; k < paisesEnemigos.size(); k++) {
                        Pais pLim = paisesEnemigos.get(k);
                        if (pLim.getConquistador().getColor().compareTo(m.getColor()) == 0) {
                            jB_agregarActionPerformed(pAux);
                        }
                    }
                }
            } else {
                int[] faltan = m.getFaltanParaCondiciones();
                for (int i = 0; i < faltan.length; i++) {
                    if (faltan[i] > 0) {
                        for (int k = 0; k < cantidadPaises; k++) {
                            Pais pAux = paisesAux.get(i);
                            if (pAux.getIdContinente() == i) {
                                jB_agregarActionPerformed(pAux);
                            }
                        }
                    }
                }
            }

            int ran = (int) (Math.random() * cantidadPaises);
            Pais pAux = paisesAux.get(ran);
            jB_agregarActionPerformed(pAux);
        }
        jB_terminarTurnoActionPerformed();
    }

    private void jB_terminarTurnoActionPerformed() {
        try {
            Thread.sleep(duermeMas);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.jCB_tarjeta0.setEnabled(false);
        this.jCB_tarjeta1.setEnabled(false);
        this.jCB_tarjeta2.setEnabled(false);
        this.jCB_tarjeta3.setEnabled(false);
        this.jCB_tarjeta4.setEnabled(false);
        cli.avisarFinTurno();
    }

    public void cambiarTurno() {
        puedeAgregar = true;
        if (cambioRonda) {
            jugadorTurnoActual = this.jugadorComienzaRonda;
            this.cambioRonda = false;
        } else {
            jugadorTurnoActual++;
            if (jugadorTurnoActual == this.jugadores.size()) {
                jugadorTurnoActual = 0;
            }
        }
        paisesConquistadosEnTurno = 0;

        if (jugadorTurnoActual == cli.getIdJugador()) {
            if (jugadores.get(jugadorTurnoActual).getCantidadPaises() != 0) {
                sacarTarjeta = false;

                //Habilitar botones
                this.jCB_tarjeta0.setEnabled(true);
                this.jCB_tarjeta1.setEnabled(true);
                this.jCB_tarjeta2.setEnabled(true);
                this.jCB_tarjeta3.setEnabled(true);
                this.jCB_tarjeta4.setEnabled(true);
                if (rondaAtaque()) {
                    habilitarTropasReagrupar();
                } else {
                    habilitarAgregarTropas();
                }
            } else {
                jB_terminarTurnoActionPerformed();
            }

        }
    }

    private boolean rondaAtaque() {
        if (this.ronda % 2 == 1 && this.ronda != 1) {
            return true;
        } else {
            return false;
        }
    }

    private void habilitarTropasReagrupar() {
        try {
            Thread.sleep(duermeMas);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }

        for (int i = 0; i < paises.size(); i++) {
            Pais p = (Pais) paises.getObject(i);
            p.habilitarTropas();
        }

        atacarVirtual();

    }

    public void cambiarRonda() {
        ronda++;
        if (ronda > 3 && ronda % 2 == 0) {
            this.cambioRonda = true;
            this.jugadorComienzaRonda++;
            if (this.jugadorComienzaRonda == this.jugadores.size()) {
                this.jugadorComienzaRonda = 0;
            }

        }
        this.cambiarTurno();
    }

    private void atacarVirtual() {
        Jugador j = jugadores.get(this.jugadorTurnoActual);
        ArrayList<Pais> paisesAux = j.getPaises();
        int cantidadPaises = paisesAux.size();
        ArrayList<Pais> paisesEnemigos;

        for (int i = 0; i < cantidadPaises; i++) {
            Pais pAux = paisesAux.get(i);
            paisesEnemigos = pAux.getPaisesEnemigos();
            for (int k = 0; k < paisesEnemigos.size(); k++) {
                Pais pLim = paisesEnemigos.get(k);

                while (pAux.getCantidadTropas() - pLim.getCantidadTropas() > 2 && pLim.getConquistador().getId() != j.getId() && !finPartida) {
                    atacar(pAux, pLim);
                }
            }
        }
        reagruparVirtual();
    }

    private void atacar(Pais pAux, Pais pLim) {


        Pais pAtaca = pAux;
        int cantidadAtaque = pAtaca.getCantidadTropas() - 1;
        if (cantidadAtaque == 0) {
            return;
        }
        if (cantidadAtaque > 3) {
            cantidadAtaque = 3;
        }

        Pais pDefiende = pLim;
        int cantidadDefensa = pDefiende.getCantidadTropas();
        if (cantidadDefensa > 3) {
            cantidadDefensa = 3;
        }

        int ataqueTropa;
        int dadoAtaque;
        int ataqueTotal;

        int defensaTropa;
        int dadoDefensa;
        int defensaTotal;

        LinkedList ataque = new LinkedList(), defensa = new LinkedList();
        for (int i = 0; i < cantidadAtaque; i++) {
            ataqueTropa = 0;
            dadoAtaque = (int) (Math.random() * 6 + 1);
            ataqueTotal = dadoAtaque + ataqueTropa;
            ataque.addInOrder(ataqueTotal);
        }
        for (int i = 0; i < cantidadDefensa; i++) {
            defensaTropa = 0;
            dadoDefensa = (int) (Math.random() * 6 + 1);
            defensaTotal = dadoDefensa + defensaTropa;
            defensa.addInOrder(defensaTotal);
        }

        int ganados = 0;
        int perdidos = 0;
        Comparable a = 0;
        Comparable d = 0;

        String avisar = "avisarAtaque" + delimitador + pAtaca.getId() + delimitador + pDefiende.getId();

        for (int i = 1; i < 4; i++) {
            int aRes = ataque.size() - i;
            if (aRes >= 0) {
                a = ataque.get(aRes);
            }
            int dRes = defensa.size() - i;
            if (dRes >= 0) {
                d = defensa.get(dRes);
            }

            if (aRes >= 0 && dRes >= 0) {
                if (a.compareTo(d) > 0) {
                    ganados++;
                } else {
                    perdidos++;
                }
            }
            if (a.compareTo(0) == 0) {
                a = "";
            }

            if (d.compareTo(0) == 0) {
                d = "";
            }

            avisar += delimitador + a + delimitador + d;

            a = d = 0;
        }

        avisar += delimitador + ganados + delimitador + perdidos;

        pAtaca.quitarTropas(perdidos);
        if (pDefiende.quitarTropas(ganados) == 0) {
            int paConquist = 0;
            if (this.tipoMision == 0) {
                verificarMisionSecundaria(pDefiende);
                paConquist = 30;
            } else if (this.tipoMision == 1) {
                paConquist = 30;
            } else if (this.tipoMision == 2) {
                paConquist = 50;
            }
            
            int tropasQuedaron = cantidadAtaque - perdidos;

            int cantidadPasar = (int) (Math.random() * tropasQuedaron);

            actualizarPostConquista(pAtaca, pDefiende);

            if (cantidadPasar == 2) {
                pAtaca.quitarTropas(1);
                pDefiende.addTropa(new Tropa(true));
            } else if (cantidadPasar >= 3) {
                pAtaca.quitarTropas(2);
                pDefiende.addTropa(new Tropa(true));
                pDefiende.addTropa(new Tropa(true));
            }

            avisar += delimitador + cantidadPasar;

            if (cantidadPaisesPropios() >= paConquist) {
                finDePartida("Ganastee!!!!!!!!! Soss grosos chabon");
                cli.avisarFinPartida();
            } else if (!sacarTarjeta) {
                if (this.nroCanje < 3) {
                    this.sacarTarjeta = true;
                } else {
                    paisesConquistadosEnTurno++;
                    if (paisesConquistadosEnTurno > 1) {
                        this.sacarTarjeta = true;
                    }
                }
            }

        }
        cli.avisarAtaque(avisar);

        try {
            Thread.sleep(duermeMas);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void verificarMisionSecundaria(Pais pDefiende) {
        if (jugadores.get(jugadorTurnoActual).getMision().isCumplida(pDefiende)) {
            finDePartida("Ganastee!!!!!!!!! Soss grosos chabon");
            cli.avisarFinPartida();
        }
    }

    private void actualizarPostConquista(Pais pAtaca, Pais pDefiende) {
        //Se actualiza el pais atacante
        pAtaca.quitarTropas(1);
        //Se actualiza el jugador ganador
        pAtaca.getConquistador().addPais(pDefiende);
        //Actualizar tema continentes
        Jugador jj = this.jugadores.get(pDefiende.getConquistador().getId());
        int idContinente = pDefiende.getIdContinente();
        jj.restarPaisContinente(idContinente);
        //Se actualiza el jugador perdedor
        pDefiende.getConquistador().removePais(pDefiende);
        //Se actualiza el pais defensor
        pDefiende.actualizarConquistador(jugadores.get(jugadorTurnoActual));
    }

    public void actualizarAtaque(ArrayList<String> contenidoLineaEntrada) {
        Pais pAtaca = (Pais) paises.getObject(Integer.parseInt(contenidoLineaEntrada.get(1)));
        Pais pDefiende = (Pais) paises.getObject(Integer.parseInt(contenidoLineaEntrada.get(2)));

        int cantidadPasar = Integer.parseInt(contenidoLineaEntrada.get(contenidoLineaEntrada.size() - 1));

        pAtaca.getJB().setEnabled(true);
        pDefiende.getJB().setEnabled(true);

        int ganados = Integer.parseInt(contenidoLineaEntrada.get(9));
        int perdidos = Integer.parseInt(contenidoLineaEntrada.get(10));

        pAtaca.quitarTropas(perdidos);
        if (pDefiende.quitarTropas(ganados) == 0) {
            actualizarPostConquista(pAtaca, pDefiende);

            if (cantidadPasar == 2) {
                pAtaca.quitarTropas(1);
                pDefiende.addTropa(new Tropa(true));
            } else if (cantidadPasar == 3) {
                pAtaca.quitarTropas(2);
                pDefiende.addTropa(new Tropa(true));
                pDefiende.addTropa(new Tropa(true));
            }
        }
    }

    public void avisarFinPartida(int parseInt) {
        finPartida = true;
    }

    private void reagruparVirtual() {
        Jugador j = jugadores.get(this.jugadorTurnoActual);
        ArrayList<Pais> paisesAux = j.getPaises();
        int cantidadPaises = paisesAux.size();
        ArrayList<Pais> paisesPropios;
        ArrayList<Pais> paisesLimEnemigos;
        for (int i = 0; i < cantidadPaises; i++) {
            Pais pAux = paisesAux.get(i);
            paisesPropios = pAux.getPaisesPropios();
            for (int k = 0; k < paisesPropios.size(); k++) {
                Pais pLim = paisesPropios.get(k);
                paisesLimEnemigos = pLim.getPaisesEnemigos();
                for (int l = 0; l < paisesLimEnemigos.size(); l++) {
                    Pais pLimLim = paisesLimEnemigos.get(l);
                    if (pLimLim.getCantidadTropas() - pLim.getCantidadTropas() > 2 && pAux.getCantidadTropasDisponiblesReagrupar() > 0 && !finPartida) {
                        System.out.println("Reagrupando...");
                        reagrupar(pAux, pLim);
                    }
                }
            }
        }


        tarjetaVirtual();
    }

    private void reagrupar(Pais pAux, Pais pLim) {
        Pais pDesde = pAux;
        Pais pHasta = pLim;
        if (pDesde.getCantidadTropasDisponiblesReagrupar() > 0) {
            pDesde.quitarTropas(1);
            pHasta.addTropa(new Tropa(false));
            cli.avisarReagrupacion("avisarReagrupacion" + delimitador + pDesde.getId() + delimitador + pHasta.getId());
        }

        try {
            Thread.sleep(duermeMas);
        } catch (InterruptedException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void actualizarReagrupacion(int desde, int hasta) {

        Pais pDesde = (Pais) paises.getObject(desde);
        Pais pHasta = (Pais) paises.getObject(hasta);

        pDesde.getJB().setEnabled(true);
        pHasta.getJB().setEnabled(true);


        pDesde.quitarTropas(1);
        pHasta.addTropa(new Tropa(false));
    }

    private void tarjetaVirtual() {

        tomarTarjeta();
        if (!finPartida) {
            jB_terminarTurnoActionPerformed();
        }
    }

    private void tomarTarjeta() {
        Jugador j = jugadores.get(this.jugadorTurnoActual);
        if (j.getCantidadTarjetas() < 6) {
            if (this.tarjetas.size() == 0) {
                this.mezclarMazo();
                cli.avisarFinDeMazoTarjeta();
            }

            Tarjeta tarjeta = (Tarjeta) this.tarjetas.removeFirst();

            j.addTarjeta(tarjeta);

            cli.avisarSolicitudTarjeta();


            Tarjeta t = tarjeta;
            if (j.existePais(t.getId()) && !t.isUsada()) {

                t.setUsada(true);
                int idPais = t.getId();
                j.getPais(idPais).addTropa(new Tropa(true));
                j.getPais(idPais).addTropa(new Tropa(true));

                cli.avisarUsoTarjeta(idPais);
            }
        } else {
        }
    }

    public void mezclarMazo() {
        for (int i = 0; i < this.tarjetasFueraDelMazo.size(); i++) {
            if (i % 2 == 0) {
                this.tarjetas.addFirst(this.tarjetasFueraDelMazo.get(i));
            } else {
                this.tarjetas.addLast(this.tarjetasFueraDelMazo.get(i));
            }
        }
    }

    public void sacarTarjeta() {
        this.tarjetas.removeFirst();
    }

    public void avisarUsoTarjeta(int parseInt) {
    }
    
    
}